/*
 * Zirco Browser for Android Copyright (C) 2010 J. Devauchelle and contributors. This program is free software; you can
 * redistribute it and/or modify it under the terms of the GNU General Public License version 3 as published by the Free
 * Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
 * License for more details.
 */

package org.zirco.model.adapters;

import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import org.zirco.R;
import org.zirco.model.items.DownloadItem;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * The adapter for the download UI list.
 */
public class DownloadListAdapter extends BaseAdapter {

    private Context                        mContext;
    private List<DownloadItem>             mDownloads;

    private Map<DownloadItem, TextView>    mTitleMap;
    private Map<DownloadItem, ProgressBar> mBarMap;
    private Map<DownloadItem, ImageButton> mButtonMap;

    /**
     * Constructor.
     * 
     * @param context The current context.
     * @param downloads The download list.
     */
    public DownloadListAdapter(Context context, List<DownloadItem> downloads){
        mContext = context;
        mDownloads = downloads;
        mTitleMap = new Hashtable<DownloadItem, TextView>();
        mBarMap = new Hashtable<DownloadItem, ProgressBar>();
        mButtonMap = new Hashtable<DownloadItem, ImageButton>();
    }

    /**
     * Get a map of download item related to the UI text component representing the download title.
     * 
     * @return A Map<DownloadItem, TextView>.
     */
    public Map<DownloadItem, TextView> getTitleMap() {
        return mTitleMap;
    }

    /**
     * Get a map of download item related to the UI progress bar component.
     * 
     * @return A Map<DownloadItem, ProgressBar>.
     */
    public Map<DownloadItem, ProgressBar> getBarMap() {
        return mBarMap;
    }

    /**
     * Get a map of download item related to the UI cancel button component.
     * 
     * @return A Map<DownloadItem, ImageButton>.
     */
    public Map<DownloadItem, ImageButton> getButtonMap() {
        return mButtonMap;
    }

    @Override
    public int getCount() {
        return mDownloads.size();
    }

    @Override
    public Object getItem(int position) {
        return mDownloads.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.download_row, null);
        }

        final DownloadItem item = mDownloads.get(position);

        final ProgressBar progressBar = (ProgressBar) convertView.findViewById(R.id.DownloadRow_ProgressBar);
        final TextView fileNameView = (TextView) convertView.findViewById(R.id.DownloadRow_FileName);
        TextView urlView = (TextView) convertView.findViewById(R.id.DownloadRow_Url);
        final ImageButton stopButton = (ImageButton) convertView.findViewById(R.id.DownloadRow_StopBtn);

        progressBar.setIndeterminate(false);
        progressBar.setMax(100);
        progressBar.setProgress(item.getProgress());

        if (item.isAborted()) {
            fileNameView.setText(String.format(mContext.getResources().getString(R.string.DownloadListActivity_Aborted),
                                               item.getFileName()));
            stopButton.setEnabled(false);
        } else if (item.isFinished()) {
            fileNameView.setText(String.format(mContext.getResources().getString(R.string.DownloadListActivity_Finished),
                                               item.getFileName()));
            stopButton.setEnabled(false);
        } else {
            fileNameView.setText(item.getFileName());
        }
        urlView.setText(item.getUrl());

        stopButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                item.abortDownload();
                stopButton.setEnabled(false);
                fileNameView.setText(String.format(mContext.getResources().getString(R.string.DownloadListActivity_Aborted),
                                                   item.getFileName()));
                progressBar.setProgress(progressBar.getMax());
            }

        });

        mTitleMap.put(item, fileNameView);
        mBarMap.put(item, progressBar);
        mButtonMap.put(item, stopButton);

        return convertView;
    }

}
